// DynArray.h

// Dynamicke pole

#ifndef DYNARRAY_H
#define DYNARRAY_H

#include <assert.h>

// Sablona definuje triedu zapuzdrujucu jednorozmerne dynamicke pole pointrov na T
template<class T,int maxSize>
class DynArray
{

private:
	// Pole pointrov na T
	T* array[maxSize];
	// Aktualny pocet prvkov
	int nSize;

public:
	// Konstruktor
	DynArray() : nSize(0)
	{
		// Vynuluje sa pole pointrov
		for(int i = 0; i < maxSize; i++)
			array[i] = 0;
	}
	// Destruktor
	~DynArray()
	{
		RemoveAll();
	}

	// Operator [] pre pristup do pola (vracia referenciu na typ)
	T& operator[](int nIndex)
	{
		assert(nIndex < nSize && nIndex >=0);
		assert(array[nIndex]);

		return *(array[nIndex]);
	}

	// Operator [] pre pristup do pola (vracia typ)
	T operator[](int nIndex ) const
	{
		assert(nIndex < nSize && nIndex >=0);
		assert(array[nIndex]);

		return *(array[nIndex]);
	}
	// Prida sa prvok do pola
	int Add(const T& newElement)
	{
		assert(nSize < maxSize);
		array[nSize] = new T(newElement);

		nSize++;
		return nSize - 1;
	}
	// Vrati sa aktualny pocet prvkov v poli
	int GetSize() const
	{
		return nSize;
	}
	// Vrati sa horna hranica pola
	int GetUpperBound( ) const
	{
		return GetSize() - 1;
	}
	// Vymazu sa vsetky prvky pola a vynuluju pointre v poli
	void RemoveAll()
	{
		for(int i = 0; i < nSize; i++)
		{
			delete array[i];
			array[i] = 0;
		}
		nSize = 0;
	}
	// Vymaze sa prvok pola podla jeho indexu a prekopiruju zvysne prvky 
	void RemoveAt(int nIndex)
	{
		assert(nIndex < nSize && nIndex >=0);
		delete array[nIndex];
		for(int i = nIndex + 1; i < nSize;i++)
		{
			array[i-1] = array[i];
		}
		nSize--;
	}
};

#endif	// DYNARRAY_H
